package net.qiujuer.library.clink.core;

import java.io.Closeable;
import java.nio.channels.SocketChannel;

/**
 * 用来做提供者的模式
 * 是针对所有连接的，所有的连接都可以通过IoProvider来进行注册和解除注册。
 */
public interface IoProvider extends Closeable {
    // 从SocketChannel读取数据
    boolean registerInput(SocketChannel channel, HandleInputCallback callback);
    // 向SocketChannel写入数据
    boolean registerOutput(SocketChannel channel, HandleOutputCallback callback);

    void unRegisterInput(SocketChannel channel);

    void unRegisterOutput(SocketChannel channel);

    abstract class HandleInputCallback implements Runnable {
        @Override
        public final void run() {
            canProviderInput();
        }

        // 当前能够提供输入，代表SocketChannel当前是提供输入的
        protected abstract void canProviderInput();
    }

    abstract class HandleOutputCallback implements Runnable {
        @Override
        public final void run() {
            canProviderOutput();
        }
        protected abstract void canProviderOutput();
    }

}
